package Interface.Tuple;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import Controleur.ControleurGestionTuples;
import Interface.InterfaceListeNomTable;
import Interface.Observateur;

@SuppressWarnings("serial")
public class InterfaceGestionTuples extends JInternalFrame implements Observateur, ActionListener, MouseListener{


	private JButton btAjouterTuple;
	
	private JPanel contentPaneDroit;
	private JPanel contentPaneGauche;
	private InterfaceListeNomTable interfaceListeTable;
	private JSplitPane split;
	private ControleurGestionTuples controleur;
	private JTable tableau;

	JMenuItem itemSupprimerTuple;
	JMenuItem itemSauvegarderTuple;

	public InterfaceGestionTuples()
	{
		this.setName("Gestion des tuples");
		this.setClosable(true);

		this.controleur = ControleurGestionTuples.getInstance();

		/*	Panneau Gauche */
		contentPaneGauche = new JPanel();
		this.contentPaneGauche.setLayout(new BorderLayout());

		/*	Panneau Droit */
		contentPaneDroit = new JPanel();
		this.contentPaneDroit.setLayout(new BorderLayout());

		tableau = new JTable();

		this.contentPaneDroit.add(tableau);
		btAjouterTuple = new JButton("Ajouter un tuple");
		btAjouterTuple.addActionListener(this);

		JPanel p = new JPanel();
		p.setLayout(new GridLayout(1,2));
		p.add(btAjouterTuple);
		this.contentPaneDroit.add(p,BorderLayout.SOUTH);


		/*	Scroll Bare de la partie gauche	*/
		interfaceListeTable = new InterfaceListeNomTable();
		interfaceListeTable.addObservateur(this);
		this.contentPaneGauche.add(interfaceListeTable);

		/*	Split	Entre la parti gauche et droite	*/

		split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, this.contentPaneGauche, this.contentPaneDroit);
		this.add(split, BorderLayout.CENTER);

		this.itemSupprimerTuple= new JMenuItem("Supprimer le tuple");
		this.itemSupprimerTuple.addActionListener(this);
		this.itemSauvegarderTuple= new JMenuItem("Sauvegarder le tuple");
		this.itemSauvegarderTuple.addActionListener(this);

	}

	public void active() {
		this.affichageTuples(this.interfaceListeTable.getValeur());
	}

	private void affichageTuples(String table) {
		controleur.getAllTuple(table);
		this.recharger();
	}

	private void recharger()
	{
		this.contentPaneDroit.remove(tableau);
		this.contentPaneDroit.remove(tableau.getTableHeader());
		tableau.removeMouseListener(this);
		tableau = new JTable(controleur.getDonnee(),controleur.getTabTitres());
		tableau.addMouseListener(this);
		this.contentPaneDroit.add(tableau.getTableHeader(), BorderLayout.NORTH);
		this.contentPaneDroit.add(tableau);
		this.revalidate();
	}

	public void actionPerformed(ActionEvent event) {
		Object action = event.getSource();

		if(action==this.btAjouterTuple)
		{
			this.controleur.ajouterTuple();
			this.recharger();
		}

		if(action==this.itemSupprimerTuple)
		{
			this.controleur.deleteTuple(this.tableau.getSelectedRow());
			this.recharger();
		}

		if(action==this.itemSauvegarderTuple)
		{
			List<String> listeValeurs = new ArrayList<String>();
			for(int i=0;i<this.tableau.getColumnCount();i++)
			{
				listeValeurs.add((String)tableau.getModel().getValueAt(this.tableau.getSelectedRow(),i));
			}
			this.controleur.sauvegarderTuple(this.tableau.getSelectedRow(),listeValeurs);
			this.recharger();
		}
	}

	public void mouseClicked(MouseEvent event) {
		if(event.getButton() == MouseEvent.BUTTON3)
		{
			if(tableau.getSelectedColumn()!=-1)
			{
				JPopupMenu menu = new JPopupMenu();
				menu.add(itemSupprimerTuple);
				menu.add(itemSauvegarderTuple);
				menu.show(tableau, event.getX(), event.getY());
			}
		}
	}

	public void mouseEntered(MouseEvent arg0) {
	}

	public void mouseExited(MouseEvent arg0) {
	}

	public void mousePressed(MouseEvent arg0) {
	}

	public void mouseReleased(MouseEvent arg0) {
	}
}
